/*
 * This program is free software; you can rediaddstribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is diaddstributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 * 02111-1307, USA.
 *
 * http://www.gnu.org/copyleft/gpl.html
 */

package l1j.server.server.serverpackets;

import java.util.List;
import java.util.logging.Logger;

import l1j.server.server.Opcodes;
import l1j.server.server.model.Instance.L1ItemInstance;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.model.item.L1ItemId;
import l1j.server.server.templates.L1Armor;

// Referenced classes of package l1j.server.server.serverpackets:
// ServerBasePacket

public class S_SendInvOnLogin extends ServerBasePacket {
	private static final String S_SEND_INV_ON_LOGIN = "[S] S_SendInvOnLogin";
	private static Logger _log = Logger.getLogger(S_SendInvOnLogin.class
			.getName());

	public S_SendInvOnLogin(L1PcInstance pc) {
		writeC(Opcodes.S_OPCODE_INVLIST);
		int inventorySize = pc.getInventory().getSize();
		writeC(inventorySize);
		List<L1ItemInstance> arraylist = pc.getInventory().getItems();
		for (int i = 0; i < inventorySize; i++) {
			L1ItemInstance item = arraylist.get(i);
			writeD(item.getId());
			int weight = item.getCount() * item.getItem().getWeight() / 1000;
			if (item.getItem().getWeight() != 0 && weight < 1) {
				weight = 1;
			}
			int itemType2 = item.getItem().getType2();
			int itemId = item.getItem().getItemId();
			int isId = item.isIdentified() ? 1 : 0;

			if (itemType2 == 0) { // 種別：その他のアイテム
				switch (itemId) {
				case L1ItemId.SCROLL_OF_ENCHANT_ARMOR: // 防具強化スクロール
				case L1ItemId.B_SCROLL_OF_ENCHANT_ARMOR: // 祝福された 防具強化スクロール
				case L1ItemId.C_SCROLL_OF_ENCHANT_ARMOR: // 呪われた 防具強化スクロール
				case 40078: // 古代人の呪術スクロール
				case 40129: // ギアンのスクロール
				case 140129: // 祝福された ギアンのスクロール
					writeC(27);
					break;

				case L1ItemId.SCROLL_OF_ENCHANT_WEAPON: // 武器強化スクロール
				case L1ItemId.B_SCROLL_OF_ENCHANT_WEAPON: // 祝福された 武器強化スクロール
				case L1ItemId.C_SCROLL_OF_ENCHANT_WEAPON: // 呪われた 武器強化スクロール
				case 40077: // 古代人の錬金術スクロール
				case 40130: // カルバスのスクロール
				case 140130: // 祝福された カルバスのスクロール
					writeC(26);
					break;

				case 40088: // 変身スクロール
				case 40096: // 象牙の塔の変身スクロール
				case 140088: // 祝福された 変身スクロール
					writeC(16);
					break;

				case 40317: // 砥石
				case 41036: // 糊
					writeC(14);
					break;

				case 40089: // 復活スクロール
				case 140089: // 祝福された 復活スクロール
					writeC(8);
					break;

				case 40098: // 象牙の塔の確認スクロール
				case 40126: // 確認スクロール
					writeC(7);
					break;

				case 40100: // テレポート スクロール
				case 40099: // 象牙の塔のテレポート スクロール
				case 40086: // マス テレポート スクロール
				case 40863: // スペル スクロール (テレポート)
					writeC(6);
					break;

				case 140100: // 祝福された テレポート スクロール
					writeC(29);
					break;

				case 40007: // コール ライトニング ワンド
				case 40008: // メイプル ワンド
				case 140008: // 祝福されたメイプル ワンド
				case 40410: // ブラック エントの表皮
					writeC(30);
					break;

				case 40090: // ブランク スクロール(Lv1)
				case 40091: // ブランク スクロール(Lv2)
				case 40092: // ブランク スクロール(Lv3)
				case 40093: // ブランク スクロール(Lv4)
				case 40094: // ブランク スクロール(Lv5)
					writeC(28);
					break;

				case 40859: // スペル スクロール (ヒール)
				case 40862: // スペル スクロール (エネルギー ボルト)
				case 40864: // スペル スクロール (アイス ダガー)
				case 40865: // スペル スクロール (ウインド カッター)
				case 40866: // スペル スクロール (ホーリー ウェポン)
				case 40867: // スペル スクロール (キュア ポイズン)
				case 40869: // スペル スクロール (カーズ ポイズン)
				case 40873: // スペル スクロール (ファイアー アロー)
				case 40874: // スペル スクロール (スタラック)
				case 40875: // スペル スクロール (ライトニング)
				case 40876: // スペル スクロール (ターン アンデッド)
				case 40877: // スペル スクロール (エキストラ ヒール)
				case 40878: // スペル スクロール (カーズ ブラインド)
				case 40880: // スペル スクロール (フローズン クラウド)
				case 40881: // スペル スクロール (ウィーク エレメンタル)
				case 40883: // スペル スクロール (ファイアー ボール)
				case 40884: // スペル スクロール (フィジカル エンチャント：DEX)
				case 40885: // スペル スクロール (ウェポン ブレイク)
				case 40887: // スペル スクロール (スロー)
				case 40888: // スペル スクロール (アース ジェイル)
				case 40891: // スペル スクロール (カーズ パラライズ)
				case 40892: // スペル スクロール (コール ライトニング)
				case 40893: // スペル スクロール (グレーター ヒール)
				case 40894: // スペル スクロール (テイミング モンスター)
				case 40895: // スペル スクロール (リムーブ カーズ)
				case 40896: // スペル スクロール (コーン オブ コールド)
				case 40898: // スペル スクロール (ダークネス)
					writeC(30);
					break;

				case 40868: // スペル スクロール (チル タッチ)
				case 40886: // スペル スクロール (バンパイアリック タッチ)
				case 40897: // スペル スクロール (マナ ドレイン)
					writeC(17);
					break;

				case 40870: // スペル スクロール (エンチャント ウェポン)
					writeC(26);
					break;

				case 40879: // スペル スクロール (ブレスド アーマー)
					writeC(27);
					break;

				case 40315: // ペットの笛
				case 40493: // マジック フルート
					writeC(15);
					break;

				case 40310: // 便箋
				case 40311: // 血盟便箋
					writeC(12);
					break;

				case 40730: // クリスマス カード(未使用)
					writeC(31);
					break;

				case 49020: // クリスマス カード(未開封)
				case 49021: // クリスマス カード(開封済み)
					writeC(32);
					break;

				case 40731: // バレンタインデー カード(未使用)
					writeC(33);
					break;

				case 49022: // バレンタインデー カード(未開封)
				case 49023: // バレンタインデー カード(開封済み)
					writeC(34);
					break;

				case 40732: // ホワイトデー カード(未使用)
					writeC(35);
					break;

				case 49024: // ホワイトデー カード(未開封)
				case 49025: // ホワイトデー カード(開封済み)
					writeC(36);
					break;

				default:
					writeC(0);
					break;
				}
			} else if (itemType2 == 1) { // 種別：武器
				writeC(1);
			} else if (itemType2 == 2) { // 種別：防具
				switch (item.getItem().getType()) {
				case 0: // none
					writeC(0);
					break;

				case 1: // helm
					writeC(22);
					break;

				case 2: // armor
					writeC(2);
					break;

				case 3: // T
					writeC(18);
					break;

				case 4: // cloak
					writeC(19);
					break;

				case 5: // glove
					writeC(20);
					break;

				case 6: // boots
					writeC(21);
					break;

				case 7: // shield
					writeC(25);
					break;

				case 8: // amulet
					writeC(24);
					break;

				case 9: // ring
					writeC(23);
					break;

				case 10: // belt
					writeC(37);
					break;

				case 12: // earring
					writeC(40);
					break;

				default:
					writeC(0);
					break;
				}
			}
			writeC(0);
			writeH(item.get_gfxid());
			writeC(item.getItem().getBless());
			writeD(item.getCount());
			writeC(isId);
			if (itemType2 == 0) { // 種別：その他のアイテム
				if (isId == 0) {
					if (item.isStackable() && item.getCount() > 1) {
						writeS((new StringBuilder()).append(
								item.get_itemnameid()).append(" (").append(
								item.getCount()).append(")").toString());
						writeC(0);
					} else {
						writeS((new StringBuilder()).append(
								item.get_itemnameid()).toString());
						writeC(0);
					}
				} else {
					if (item.isStackable() && item.getCount() > 1) {
						writeS((new StringBuilder()).append(
								item.get_itemnameid()).append(" (").append(
								item.getCount()).append(")").toString());
					} else {
						writeS((new StringBuilder()).append(
								item.get_itemnameid()).toString());
					}
					switch (item.getItem().getType1()) {
					case 0:
						writeC(0x08);
						writeC(0x01);
						writeC(item.getItem().getDmgSmall());
						writeC(item.getItem().getDmgLarge());
						writeC(item.getItem().getMaterial());
						writeD(weight);
						break;
					case 15:
						writeC(0x08);
						writeC(0x01);
						writeC(item.getItem().getDmgSmall());
						writeC(item.getItem().getDmgLarge());
						writeC(item.getItem().getMaterial());
						writeD(weight);
						break;
					default:
						writeC(21);
						writeC(23);
						writeC(item.getItem().getMaterial());
						writeD(weight);
						writeC(0);
						writeC(0);
						writeC(0);
						writeC(0);
						writeC(0);
						writeC(0);
						writeC(0);
						writeC(0);
						writeC(0);
						writeC(0);
						writeC(0);
						writeC(0);
						writeC(0);
						writeC(0);
						writeC(0);
						break;
					}
				}
			} else if (itemType2 == 2) { // 種別：防具
				if (isId == 0) {
					if (!item.isEquipped()) {
						writeS(item.get_itemnameid());
						writeC(0);
					} else if (item.isEquipped()) {
						writeS((new StringBuilder()).append(
								item.get_itemnameid()).append(" (").append(
								"$117").append(")").toString());
						writeC(0);
					}
				} else {
					if (!item.isEquipped()) {
						writeS((new StringBuilder()).append("+").append(
								item.getEnchantLevel()).append(" ").append(
								item.get_itemnameid()).toString());
					} else if (item.isEquipped()) {
						if (item.getEnchantLevel() > 0) {
							writeS((new StringBuilder("+")).append(
									item.getEnchantLevel()).append(" ").append(
									item.get_itemnameid()).append(" (").append(
									"$117").append(")").toString());
						} else {
							writeS((new StringBuilder()).append(
									item.get_itemnameid()).append(" (").append(
									"$117").append(")").toString());
						}
					}
					writeC(21);
					int ac = ((L1Armor) item.getItem()).get_ac();
					if (ac < 0) {
						ac = ac - ac - ac;
					}
					int material = item.getItem().getMaterial();
					int armor_weight = item.getItem().getWeight() / 1000;
					if (item.getItem().getWeight() != 0 && armor_weight < 1) {
						armor_weight = 1;
					}
					int i3 = item.getEnchantLevel();
					writeC(19);
					writeC(ac);
					writeC(material);
					writeD(armor_weight);

					// EnchantLevelの表示
					writeC(2);
					writeC(i3);

					int total_byte = 0;
					boolean use_all_class = item.getItem().isUseDarkelf()
							&& item.getItem().isUseElf()
							&& item.getItem().isUseKnight()
							&& item.getItem().isUseRoyal()
							&& item.getItem().isUseMage();

					if (!use_all_class) {
						int bit = 0;
						bit |= item.getItem().isUseRoyal() ? 1 : 0;
						bit |= item.getItem().isUseKnight() ? 2 : 0;
						bit |= item.getItem().isUseElf() ? 4 : 0;
						bit |= item.getItem().isUseMage() ? 8 : 0;
						bit |= item.getItem().isUseDarkelf() ? 16 : 0;
						writeC(7);
						writeC(bit);
						total_byte += 2;
					}
					int addstr = item.getItem().get_addstr();
					int adddex = item.getItem().get_adddex();
					int addcon = item.getItem().get_addcon();
					int addwis = item.getItem().get_addwis();
					int addint = item.getItem().get_addint();
					int addcha = item.getItem().get_addcha();
					int addhp = item.getItem().get_addhp();
					int addmr = item.getMr();
					int addmp = item.getItem().get_addmp();
					int addsp = item.getItem().get_addsp();
					if (item.getItem().isHasteItem()) {
						if (total_byte < 12) {
							writeC(18);
							total_byte += 1;
						}
					}
					if (addstr != 0) {
						if (total_byte < 12) {
							writeC(8);
							writeC(addstr);
							total_byte += 2;
						}
					}
					if (adddex != 0) {
						if (total_byte < 12) {
							writeC(9);
							writeC(adddex);
							total_byte += 2;
						}
					}
					if (addcon != 0) {
						if (total_byte < 12) {
							writeC(10);
							writeC(addcon);
							total_byte += 2;
						}
					}
					if (addwis != 0) {
						if (total_byte < 12) {
							writeC(11);
							writeC(addwis);
							total_byte += 2;
						}
					}
					if (addint != 0) {
						if (total_byte < 12) {
							writeC(12);
							writeC(addint);
							total_byte += 2;
						}
					}
					if (addcha != 0) {
						if (total_byte < 12) {
							writeC(13);
							writeC(addcha);
							total_byte += 2;
						}
					}
					if (addhp != 0) {
						if (total_byte < 12) {
							writeC(14);
							writeH(addhp);
							total_byte += 3;
						}
					}
					if (addmp != 0) {
						if (total_byte < 12) {
							writeC(32);
							writeC(addmp);
							total_byte += 2;
						}
					}
					if (addmr != 0) {
						if (total_byte < 12) {
							writeC(15);
							writeC(addmr);
							total_byte += 2;
						}
					}
					if (addsp != 0) {
						if (total_byte < 12) {
							writeC(17);
							writeC(addsp);
							total_byte += 2;
						}
					}
					for (int j = 0; j < 12 - total_byte; j++) {
						writeC(0);
					}
				}
			} else if (itemType2 == 1) { // 種別：武器
				String itemName = item.getItem().getName();
				int enchant = item.getEnchantLevel();
				if (isId == 0) { // 未鑑定
					if (item.isEquipped()) {
						writeS(itemName + " (" + "$9" + ")");
					} else {
						writeS(itemName);
					}
					writeC(0);
					continue;
				}
				if (item.isEquipped()) {
					if (enchant > 0) {
						writeS("+" + enchant + " " + itemName + " (" + "$9"
								+ ")");
					} else {
						writeS(itemName + " (" + "$9" + ")");
					}
				} else if (enchant > 0) {
					writeS("+" + enchant + " " + itemName);
				} else {
					writeS(itemName);
				}
				writeC(21);
				writeC(1);
				writeC(item.getItem().getDmgSmall());
				writeC(item.getItem().getDmgLarge());
				writeC(item.getItem().getMaterial());
				int weapon_weight = item.getItem().getWeight() / 1000;
				if (item.getItem().getWeight() != 0 && weapon_weight < 1) {
					weapon_weight = 1;
				}
				writeD(weapon_weight);
				writeC(2);
				writeC(item.getEnchantLevel());

				int total_byte = 0;
				if (item.get_durability() != 0) {
					writeC(3);
					writeC(item.get_durability());
					total_byte += 2;
				}
				if (item.getItem().getType() == 3 // tohandsword
						|| item.getItem().getType() == 4 // bow
						|| item.getItem().getType() == 5 // spear
						|| item.getItem().getType() == 11 // claw
						|| item.getItem().getType() == 12) { // edoryu
					writeC(4);
					total_byte += 1;
				}
				if (item.getItem().getHitModifier() != 0) {
					writeC(5);
					writeC(item.getItem().getHitModifier());
					total_byte += 2;
				}
				if (item.getItem().getDmgModifier() != 0) {
					writeC(6);
					writeC(item.getItem().getDmgModifier());
					total_byte += 2;
				}
				boolean use_all_class = item.getItem().isUseDarkelf()
						&& item.getItem().isUseElf()
						&& item.getItem().isUseKnight()
						&& item.getItem().isUseRoyal()
						&& item.getItem().isUseMage();

				if (!use_all_class) {
					int bit = 0;
					bit |= item.getItem().isUseRoyal() ? 1 : 0;
					bit |= item.getItem().isUseKnight() ? 2 : 0;
					bit |= item.getItem().isUseElf() ? 4 : 0;
					bit |= item.getItem().isUseMage() ? 8 : 0;
					bit |= item.getItem().isUseDarkelf() ? 16 : 0;
					writeC(7);
					writeC(bit);
					total_byte += 2;
				}
				int addstr = item.getItem().get_addstr();
				int adddex = item.getItem().get_adddex();
				int addcon = item.getItem().get_addcon();
				int addwis = item.getItem().get_addwis();
				int addint = item.getItem().get_addint();
				int addcha = item.getItem().get_addcha();
				int addhp = item.getItem().get_addhp();
				int addmp = item.getItem().get_addmp();
				int addsp = item.getItem().get_addsp();
				if (itemId == 126 || itemId == 127) { // マナスタッフ、鋼鉄のマナスタッフ
					if (total_byte < 10) {
						writeC(16);
						total_byte += 1;
					}
				}
				if (item.getItem().isHasteItem()) {
					if (total_byte < 10) {
						writeC(18);
						total_byte += 1;
					}
				}
				if (addstr != 0) {
					if (total_byte < 10) {
						writeC(8);
						writeC(addstr);
						total_byte += 2;
					}
				}
				if (adddex != 0) {
					if (total_byte < 10) {
						writeC(9);
						writeC(adddex);
						total_byte += 2;
					}
				}
				if (addcon != 0) {
					if (total_byte < 10) {
						writeC(10);
						writeC(addcon);
						total_byte += 2;
					}
				}
				if (addwis != 0) {
					if (total_byte < 10) {
						writeC(11);
						writeC(addwis);
						total_byte += 2;
					}
				}
				if (addint != 0) {
					if (total_byte < 10) {
						writeC(12);
						writeC(addint);
						total_byte += 2;
					}
				}
				if (addcha != 0) {
					if (total_byte < 10) {
						writeC(13);
						writeC(addcha);
						total_byte += 2;
					}
				}
				if (addhp != 0) {
					if (total_byte < 10) {
						writeC(14);
						writeH(addhp);
						total_byte += 3;
					}
				}
				if (addmp != 0) {
					if (total_byte < 10) {
						writeC(32);
						writeC(addmp);
						total_byte += 2;
					}
				}
				if (addsp != 0) {
					if (total_byte < 10) {
						writeC(17);
						writeC(addsp);
						total_byte += 2;
					}
				}
				for (int k = 0; k < 11 - total_byte; k++) {
					writeC(0);
				}
			}
		}
	}

	@Override
	public byte[] getContent() {
		return getBytes();
	}

	public String getType() {
		return S_SEND_INV_ON_LOGIN;
	}

}